from rest_framework import serializers
from users.models import User
from django.contrib.auth.models import Group


class UserSerializer(serializers.ModelSerializer):
    """ 用户 模型类序列化器 """

    # groups = ???
    # user_permissions = ???

    class Meta:
        model = User
        fields = ["id", "username", "email", "mobile", "password", "groups", "user_permissions"]
        extra_kwargs = {
            "password": {"write_only": True},
        }

    # TODO：添加运营用户(商家) 方法① - 可以同时作用于后续的新建和更新流程
    #  重写validate校验函数，对密码加密，以及添加后台新建用户时默认is_staff=True的有效数据
    def validate(self, attrs):
        attrs["is_staff"] = True            # 添加运营用户(商家)字段
        password = attrs.get("password")    # 此时还是明文密码

        # make_password是一个全局函数，django利用该函数加密用户密码
        from django.contrib.auth.hashers import make_password
        secret_password = make_password(password)   # 加密原密码
        attrs["password"] = secret_password         # 用加密的密码覆盖效数据中的明文密码

        return attrs

    # TODO：添加运营用户(商家) 方法② - 密码加密只对新建有效，对更新无效
    #  重写create函数，对密码加密，以及添加后台新建用户时默认is_staff=True的有效数据
    # def create(self, validated_data):
    #     validated_data["is_staff"] = True   # 添加运营用户(商家)字段
    #     password = validated_data.get("password")   # 此时还是明文密码
    #
    #     # 调用父类方法创建运营用户(商家)
    #     admin_user = super().create(validated_data)
    #     # 用户密码加密
    #     admin_user.set_password(password)
    #     admin_user.save()
    #
    #     return admin_user


class GroupSimpleSerializer(serializers.ModelSerializer):
    """ 用户组 简单 模型类序列化器"""

    class Meta:
        model = Group
        fields = ["id", "name"]
